데이터 클래스
데이터 클래스는 평범한 값들을 보관하는 용도의 클래스를 쉽게 만드는 데 씁니다. 데이터 클래스로 만들면 클래스를 복제하거나 문자열 표현을 하거나 컬렉션의 값으로 쓸 때 필요한 메서드들을 자동으로 만들어 줍니다. 물론, 이 메서드들을 필요에 따라 재정의할 수도 있습니다.
data class User(val name: String, val id: Int) { // 1
override fun equals(other: Any?) =
other is User && other.id == this.id // 2
}
fun main() {
val user = User("석구", 1)
println(user) // 3
val secondUser = User("석구", 1)
val thirdUser = User("동석", 2)
println("user == secondUser: ${user == secondUser}") // 4
println("user == thirdUser: ${user == thirdUser}")
// hashCode() function
println(user.hashCode()) // 5
println(secondUser.hashCode())
println(thirdUser.hashCode())
// copy() function
println(user.copy()) // 6
println(user === user.copy()) // 7
println(user.copy("동석")) // 8
println(user.copy(id = 3)) // 9
println("name = ${user.component1()}") // 10
println("id = ${user.component2()}")
}
data제어자를 붙여서 데이터 클래스를 정의했습니다.- User 인스턴스이고
id값만 같다면 전체 값이 같다고 판단하도록,equals메서드를 재정의했습니다. toString메서드는 자동으로 생성되며,println으로 확인해 보기 좋습니다.- 두 인스턴스의
id만 같다면equals메서드는 참을 반환합니다. - 데이터 클래스의 속성들이 같다면
hashCode값도 똑같게 나옵니다. - 자동 생성된
copy함수로 새 인스턴스를 쉽게 만들어 낼 수 있습니다. copy는 새로운 인스턴스를 만들기 때문에, 원래의 인스턴스와 새 인스턴스는 다른 참조값을 갖습니다.- 데이터 클래스를 복제할 때 특정 속성을 바꿀 수 있습니다.
copy는 클래스 생성자와 같은 순서로 파라미터를 받습니다. copy에 이름지정(named) 파라미터를 전달해서 순서 상관없이 특정 속성 값을 바꿀 수 있습니다.- 자동 생성되는
componentN함수를 써서, 데이터 클래스를 정의할 때의 속성들을 순서대로 접근할 수 있습니다.